﻿
#pragma once
#include "Engine/common.h"
#include "Engine/ControlDef.h"

const int 标头宽度=WinViewWidth;
const int 标头高度=20;
const int 标头X=0;
const int 标头Y=0;

const int 返回按钮宽度=36;
const int 返回按钮高度=20;
const int 返回按钮X=WinViewWidth-返回按钮宽度;
const int 返回按钮Y=0;

const int 左侧设置区宽度=700;
const int 左侧设置区高度=WinViewHeight-标头高度;
const int 左侧设置区X=0;
const int 左侧设置区Y=标头高度;

const int 面板标题宽度=600;
const int 面板标题高度=30;
const int 通用图标宽高=28;
const int 滚动条宽度=16;

const int 装备面板标题X=0;
const int 装备面板标题Y=0;

const int 装备面板高度=1540;
const int 装备面板宽度=左侧设置区宽度-滚动条宽度;
const int 装备面板X=0;
const int 装备面板Y=装备面板标题Y+面板标题高度;

const int 条件面板标题X=0;
const int 条件面板标题Y=装备面板Y+装备面板高度;

const int 条件面板高度=1050;
const int 条件面板宽度=左侧设置区宽度-滚动条宽度;
const int 条件面板X=0;
const int 条件面板Y=条件面板标题Y+面板标题高度;

const int 技能面板标题X=0;
const int 技能面板标题Y=条件面板Y+条件面板高度;

const int 技能面板高度=1500;
const int 技能面板宽度=左侧设置区宽度-滚动条宽度;
const int 技能面板X=0;
const int 技能面板Y=技能面板标题Y+面板标题高度;

const int 打造面板标题X=0;
const int 打造面板标题Y=技能面板Y+技能面板高度;

const int 打造面板高度=2100;
const int 打造面板宽度=左侧设置区宽度-滚动条宽度;
const int 打造面板X=0;
const int 打造面板Y=打造面板标题Y+面板标题高度;

const int 特性面板标题X=0;
const int 特性面板标题Y=打造面板Y+打造面板高度;

const int 特性面板高度=500;
const int 特性面板宽度=左侧设置区宽度-滚动条宽度;
const int 特性面板X=0;
const int 特性面板Y=特性面板标题Y+面板标题高度;

const int 左侧设置区虚拟高度=装备面板高度+条件面板高度+技能面板高度+打造面板高度+特性面板高度+面板标题高度*5;

const int 右侧信息区宽度=WinViewWidth-左侧设置区宽度;
const int 右侧信息区高度=WinViewHeight-标头高度;
const int 右侧信息区X=左侧设置区宽度;
const int 右侧信息区Y=标头高度;

const int 角色详情面板宽度=右侧信息区宽度;
const int 角色详情面板高度=WinViewHeight-标头高度-CHTabView::TabHeight;
const int 角色详情面板高度_短=680;
const int 角色详情面板X=0;
const int 角色详情面板Y=0;

const int 冷却详情面板宽度=右侧信息区宽度;
const int 冷却详情面板高度=WinViewHeight-标头高度-CHTabView::TabHeight;
const int 冷却详情面板X=0;
const int 冷却详情面板Y=0;

const int 装备详情面板宽度=右侧信息区宽度;
const int 装备详情面板高度=WinViewHeight-标头高度-CHTabView::TabHeight;
const int 装备详情面板X=0;
const int 装备详情面板Y=0;

extern int PageId_SelectJob;
extern int PageId_Setting;	
extern int PageId_DamageDetail;
extern int UI_AdjustState;
extern int CurrentJob;


enum ImageRType
{
	IT_None,
	IT_Bitmap,
	IT_Scale9,
	IT_Animation,
};

struct ImageR_t;
class CButton;
class CImage;
class CLabel;
class CLineLabel;
class CCheckBox;
class CVScrollView;
class CEdit;
class CSpListBox;
class CDropList;
class CHSlider;
class CHTabView;
class UIControl;

ImageRType GetIconType(int ResId);
ImageR_t* EasyLoadImageR(int ResId,ImageRType Type=IT_Bitmap);
void SetCreateControlParam(int X,int Y,UIControl* Parent,int PageId);
CButton* EasyCreateButton(int CtrlId,int Width,int Height,WCHAR* Text);
CButton* EasyCreateFlatButton(int CtrlId,int Width,int Height,WCHAR* Text);
CImage* EasyCreateImage(int CtrlId,int Width,int Height,int ResId=-1,ImageRType Type=IT_Bitmap);
CLabel* EasyCreateLabel(int CtrlId,int Width,int Height,WCHAR* Text);
CLineLabel* EasyCreateLineLabel(int CtrlId,int Width,int Height,WCHAR* Text);
CCheckBox* EasyCreateCheckBox(int CtrlId,WCHAR* Text);
CVScrollView* EasyCreateScrollView(int CtrlId,int Width,int Height,int VirtualHeight);
CEdit* EasyCreateEdit(int CtrlId,int Width);
CSpListBox* EasyCreateSpListBox(int CtrlId,int Width,int Height);
CDropList* EasyCreateDropList(int CtrlId,int Width,BOOL IconStyle);
CHSlider* EasyCreateSlider(int CtrlId,int Width);
CHTabView* EasyCreateTabView(int CtrlId,int Width,int Height);
//模板不支持声明和定义分离
template<typename T>
T* EasyFindControl(int PageId,int CtrlId)
{
	return (T*)UiMgr->FindControl(PageId,GetCtrlId(CtrlId));
}

//此函数让文本保留小数显示，当RoundNum为-1时表示整数型
//为了方便使用，要求所有输入值省略百分号，例如技攻+0.5%只填0.5
//如果加了百分号，此函数会自动去掉，而不是让解析后的值缩水100倍
//函数返回调整后的值
//此函数内部调用CEdit::SetText()，如果不希望触发回调，需要提前设置UI_AdjustState
//特别注意，参数Text一般是编辑框持有的指针，调用后会使其失效
float EditChangeAdjust(CEdit* CtrlEdit,WCHAR* Text,int Len,int RoundNum,BOOL Positive);

/*
装备描述直接放在Label里，自动换行，所以以大段存储
开头是名字，中间全是描述内容，遇到\r\n@结尾，准备下一个
特别要求两件装备的描述间空一行
如果是@@，则为文件结尾
@名字1\r\n
装备描述1段落\r\n
\r\n
@名字2\r\n
装备描述2段落\r\n
\r\n
@@

词条描述放在SpListBox里，需要分成多行，先准备10个槽位
（实际支持一段内多行，但是不支持行间距）
格式类似，开头是名字，中间是描述内容，每条以\r\n结束，遇到\r\n@结尾，准备下一个
特别要求两件装备的描述间空一行
如果是@@，则为文件结尾
@名字1\r\n
装备词条1第一行\r\n
装备词条1第二行\r\n
\r\n
@名字2\r\n
装备描述2第一行\r\n
\r\n
@@

假设所有内容都没有问题，不做特殊的错误处理
暂时保存在vector里，放在一起以Tag区分
后面会按名字在装备对象中搜索，赋予装备对象
*/
enum 装备描述标记
{
	普通装备描述,
	贴膜装备描述,
	//套装装备描述,	//合并至对应装备
	武器贴膜词条描述_普通,
	武器贴膜词条描述_龙焰,
	传说贴膜词条描述,
	自定义词条描述,
};

struct 装备描述_t 
{
	WCHAR* Name;
	WCHAR* Desc;
	int Tag;
};

struct 装备词条描述_t
{
	WCHAR* Name;
	WCHAR* Desc[10];
	int Num;
	int Tag;
};

extern std::vector<装备描述_t*> 装备描述文本;
extern std::vector<装备词条描述_t*> 装备词条描述文本;

void 加载所有装备描述();
void 清理所有装备描述();


class 伤害计算结果_t
{
public:
	BOOL Valid;
	enum 属性索引
	{
		物理攻击力,	//整数
		魔法攻击力,	//整数
		独立攻击力,	//整数
		力量,		//整数
		智力,		//整数
		属性强化占位,
		攻击强化,
		攻击强化增幅,
		技能攻击力,
		直伤占比,
		冷却减少,
		技能范围,
		MP消耗量,
		攻击速度,
		施放速度,
		移动速度,
		异常伤害占比1,
		异常伤害占比2,
		异常伤害占比3,
		异常伤害占比4,
		异常伤害增加1,
		异常伤害增加2,
		异常伤害增加3,
		异常伤害增加4,
		属性抗性占位,
		异常抗性1,
		异常抗性2,
		异常抗性3,
		异常抗性4,
		异常抗性5,
		异常抗性6,
		异常抗性7,
		异常抗性8,
		异常抗性9,
		异常抗性10,
		异常抗性11,
		异常抗性12,
		异常抗性13,
		属性强化1,	//整数
		属性强化2,	//整数
		属性强化3,	//整数
		属性强化4,	//整数
		属性抗性1,	//整数
		属性抗性2,	//整数
		属性抗性3,	//整数
		属性抗性4,	//整数
		属性结果总数,
	};
	float 属性结果[属性结果总数];

	//初始化职业时，执行一次计算，并将对照数值设为当前数值
	double 总伤害;
	double 总伤害对照;

	struct 技能结果_t
	{	
		int 技能图标Id;
		int 技能等级;
		int 技能次数;
		float 技能冷却时间;
		double 技能平均伤害;
		double 技能总伤害;
		float 技能占比;
		bool operator<(技能结果_t& obj)
		{
			return this->技能占比<obj.技能占比;
		}
	};

	int 技能结果数;
	技能结果_t 技能结果[20];	//以[技能占比]排序
	int 技能结果对照数;
	技能结果_t 技能结果对照[20];

	struct 技能冷却结果_t
	{
		int 技能图标Id;
		float 技能原始时间;
		float 技能当前时间;
		float 技能缩减率;
		int 技能无色数;
		bool operator<(技能冷却结果_t& obj)
		{
			return this->技能缩减率<obj.技能缩减率;
		}
	};

	int 技能冷却结果数;
	技能冷却结果_t 技能冷却结果[20];	//以[技能缩减率]排序
	int 技能冷却结果对照数;
	技能冷却结果_t 技能冷却结果对照[20];


	struct 被动技能结果_t 
	{
		int 技能图标Id;
		float 技能等级;
	};

	int 被动技能数;
	被动技能结果_t 被动技能结果[10];	//固定顺序，无需对比

	struct 装备结果_t
	{
		int 打造物攻加成;	//武器、耳环
		int 打造魔攻加成;	//武器、耳环
		int 打造独立加成;	//耳环
		int 打造四维加成;	//合并同一部位的所有属性（实际只有四维中的一项）
		int 锻造独立加成;	//武器（合并辅助专属加成）
		BOOL 满足条件;
		WCHAR 条件描述[100];
	};

	装备结果_t 装备结果[全部装备部位总数];

	int 系统奶;	//以最高属性计算

	void Init();
	void Uninit();
	void SetBase();
	void Sort();
};

extern 伤害计算结果_t 伤害计算结果;